/**
 * @file cloop.h
 * @version 1.0
 * @date September 2024 
 * @author WSH
 *
 * @brief
 *  loop fifo
 * @note
 * @details
 *
 * @Copyright (c) 2024 WSH
 */
#ifndef __CLOOP_H__
#define __CLOOP_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "stdint.h"
#include "stdio.h"
#include "string.h"

#define CLOOP_USE_MUTEX // 是否使用互斥锁

#define CLOOP_MUTEX_LOCK   7
#define CLOOP_MUTEX_UNLOCK 0

typedef struct {
#ifdef CLOOP_USE_MUTEX
    uint8_t mutex;
#endif
    uint16_t Deep ;
    uint8_t *buf;
    
    uint8_t  opration_protect ;

    uint16_t csa_save_index   ;

    uint16_t unread_num       ;

    uint16_t csa_read_index   ;
}cloop_t;

uint8_t cloop_init(cloop_t *cloop_in,uint8_t *buf_in,uint16_t len_in);

int16_t cloop_push(cloop_t *cloop_in,const uint8_t data_in);

/******************************************************
 * @brief  CCB 输出函数
 * @param  
 * @return 0: 无数据
 *         other: 有数据 
******************************************************/
int16_t cloop_pull(cloop_t *cloop_in,uint8_t *out_buf);

/******************************************************
     * @brief  CCB 取出所有数
     * @param  out_buf 输出缓存列表
     * @param  max_len 最大长度
     * @return 0: 无数据
     *         0~max_len:读出所有程序
     *         max_len: 最大缓存
******************************************************/
int16_t cloop_pull_all(cloop_t *cloop_in,uint8_t *out_buf,uint16_t max_len);

// 重置
uint8_t cloop_reset(cloop_t *cloop_in);


#ifdef __cplusplus
}
#endif

#endif //!__CLOOP_H__
